/**
 * pageca.h
 * 声明内存片段连续管理类型及接口
 * 
 * 竹影半墙
 * 2023.08
 */
#ifndef PAGECA_H
#define PAGECA_H

#include "base.h"
#include "memca.h"

/**
 * 页式预分配管理
 * @ma    指定大小预分配管理
 * @page  预分配页下一个有效地址
 * @start 预分配页起始地址
 * @size  预分配页大小
 */
struct pageca {
    struct memca ma;
    void *page;
    void *start;
    size_t size;
};
#define pa_to_ma(pa) ((struct memca*)(pa))

static __always_inline uint16_t pca_size(struct pageca *pa)
{
    return pa->ma.size;
}

static __always_inline void 
pca_app(struct pageca *pa, uint16_t size, uint32_t max)
{
    struct memca *ma = pa_to_ma(pa);

    ma->size = size;
    ma->max = max;
    ma->num = 0;
    ma->head = NULL;
    pa->page = NULL;
    pa->start = NULL;
    pa->size  = size * max;
    return ;
}

void pca_init (struct pageca *pa);
void pca_close(struct pageca *pa);

void * pca_alloc(struct pageca *pa);
void   pca_free (struct pageca *pa, void *v);

#endif